package com.diagrammer.render
{
	import com.diagrammer.Diagrammer;
	
	import flash.display.Graphics;
	
	import mx.core.UIComponent;
	
	import spark.components.Group;
	
	/**
	 * 渲染器组件基类，继承于<code>spark.components.Group</code>
	 * <li>添加子组件 canvas:UIComponent，作为画布，显示矢量图</li>
	 * <li>添加焦点属性 focus:Boolean，设置渲染器的焦点状态</li>
	 * 
	 * @author Dwei <b>2012-02-13</b>
	 * 
	 */	
	public class BaseRender extends Group
	{
//============================================================================
//parameter
//============================================================================
		private var _diagrammer:Diagrammer;
		
		/**
		 * 标记是否需要更新界面
		 * @private
		 */		
		private var _invalidateRenderFlag:Boolean;
		
		private var _canvas:UIComponent;
		
		/**
		 * 标记焦点是否改变，若改变，更新焦点相关属性
		 * @private
		 */		
		private var _invalidateFocusPropertiesFlag:Boolean;
		
		private var _focus:Boolean;
//============================================================================
//constructor
//============================================================================
		public function BaseRender()
		{
			super();
			//默认Render的最小大小为0
			minWidth = 0;
			minHeight = 0;
			//默认Render不接受鼠标事件
			mouseEnabled = false;
			//默认不裁剪超出边界的部分
			clipAndEnableScrolling = false;
			//默认为true，第一次生命周期时需要绘制图形
			_invalidateRenderFlag = true;
			//初始化画布，因为画布不会裁剪超出边界的内容，所以设置width和height属性为 0
			_canvas = new UIComponent();
			_canvas.width = 0;
			_canvas.height = 0;
			
			//默认为true，第一次生命周期时需要初始化参数
			_invalidateFocusPropertiesFlag = true;
			_focus = false;
		}
//============================================================================
//override
//============================================================================
		override protected function createChildren():void
		{
			super.createChildren();
			addElementAt(canvas, 0);
		}
		
		override protected function childrenCreated():void
		{
			super.childrenCreated();
			initializeHandlers();
		}
		
		override protected function commitProperties():void
		{
			//更新焦点相关属性
			if (_invalidateFocusPropertiesFlag)
			{
				commitFocusProperties();
				_invalidateFocusPropertiesFlag = false;
				invalidateRender();
			}
			super.commitProperties();
		}
		
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			super.updateDisplayList(unscaledWidth, unscaledHeight);
			//更新Render界面
			if (_invalidateRenderFlag)
			{
				updateRender(unscaledWidth, unscaledHeight);
				_invalidateRenderFlag = false;
			}
		}
//============================================================================
//public
//============================================================================
		/**
		 * 标记组件，在稍候更新焦点相关属性
		 * 
		 */		
		public function invalidateFocusProperties():void
		{
			_invalidateFocusPropertiesFlag = true;
			invalidateProperties();
		}
		
		/**
		 * 标记组件，在稍候更新界面
		 * 
		 */		
		public function invalidateRender():void
		{
			_invalidateRenderFlag = true;
			invalidateDisplayList();
		}
//============================================================================
//protected
//============================================================================
		/**
		 * 初始化Render事伯监听，由createChildren()函数调用。子类需要调用父类该方法 super.initializeHandlers()。
		 * 
		 */		
		protected function initializeHandlers():void
		{
			
		}
		
		/**
		 * 在当前Render获得或者失去焦点时调用，仅需要更新会影响界面显示效果的相关属性值，不必在该处进行重绘或者其它操作。此方法是一种高级方法，可在创建 BaseRender 的子类时覆盖。<br/>
		 * 您无需直接调用此方法。在设置属性<b>focus</b>的值时，会自动调用该方法。<br/>
		 * 方法执行后会调用 invalidateRender() 方法，根据在该方法中设置的相关属性来更新界面
		 * 
		 */		
		protected function commitFocusProperties():void
		{
			
		}
		
		/**
		 * 渲染界面。此方法是一种高级方法，可在创建 BaseRender 的子类时覆盖。
		 * @param unscaledWidth 指定组件在组件坐标中的宽度（以像素为单位），而不考虑该组件的 scaleX 属性值
		 * @param unscaledHeight 指定组件在组件坐标中的高度（以像素为单位），而不考虑该组件的 scaleY 属性值
		 * 
		 */		
		protected function updateRender(unscaledWidth:Number, unscaledHeight:Number):void
		{
			
		}
//============================================================================
//getter/setter
//============================================================================
		/**
		 * 画笔
		 */		
		public function get canvasGraphics():Graphics
		{
			return canvas.graphics;
		}

		/**
		 * 矢量图画布
		 */
		public function get canvas():UIComponent
		{
			return _canvas;
		}

		/**
		 * 标识Render是否得到焦点
		 */
		public function get focus():Boolean
		{
			return _focus;
		}

		/**
		 * @private
		 */
		public function set focus(value:Boolean):void
		{
			if (value == focus) return;
			setFocus();//获取系统焦点
			_focus = value;
			invalidateFocusProperties();
		}

		/**
		 * 该Render所被持有的拓扑图控制器对象
		 */
		public function get diagrammer():Diagrammer
		{
			return _diagrammer;
		}

		/**
		 * @private
		 */
		public function set diagrammer(value:Diagrammer):void
		{
			if (!value) throw new Error("BaseRender.diagrammer不能为null");
			_diagrammer = value;
		}


	}
}